package com.cskaoyan.javase._2inner._3local._3notice.life;

/**
 * 之所以局部内部类访问局部变量,该变量不可修改,是常量
 * 本质原因是由于生命周期的冲突带来的:
 *      方法内部类的局部变量和对象的生命周期冲突产生的
 *
 * 方法内的局部变量,只要方法调用结束,局部变量就会被销毁,就没了
 * 但是局部内部类对象仍然可能存在,仍然可能访问该局部变量,那么去哪里找这个局部变量呢?
 *
 * 实际上JVM是做了特殊操作的,在创建局部内部类对象时,如果该局部内部类访问了
 * 方法内的局部变量,那么就会把该局部变量作为对象的成员变量存储,以此解决生命周期的冲突问题.
 *
 * 而以上解决方案就会引用新问题:
 *      同步问题
 *      如果允许修改该局部变量,代码中看到的修改是修饰局部变量
 *      但实际上修改的是成员变量
 *      这里就存在同步问题
 *      于是干脆禁止修改,避免同步问题,避免引入新的麻烦.
 *
 * 在最后，特别强调一点。
 * 后面学习的 匿名内部类 和 Lambda表达式 本质依然是局部内部类，这一条注意事项仍然生效。
 *
 * @since 09:38
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        EnclosedClazz ec = new EnclosedClazz();
        IA o = ec.test();
        o.testInner();
    }
}

class EnclosedClazz {
    public IA test() {
        int num = 10;
        class Inner implements IA {
            @Override
            public void testInner() {
                System.out.println(num);
                // num = 100;
            }
        }
        return new Inner();
    }
}

interface IA {
    void testInner();
}